--[[Conditions:
1. CVS emulates a SNK receptacle connector [TD.4.7.5.C.4]
2. CVS emulates USB PD 2.0 5A Active Cable [TD.4.7.5.C.1]
3. CVS emulates USB PD 3.0 5A Active Cable [TD.4.7.5.C.2]
4. CVS emulates USB4 re-driver cable (ID Header Product Type = Passive, Cable VDO indicate Vconn required, TBT3 SVID / Mode supported and mode indicates Active Cable) [TD.4.7.5.C.3] 
--]]

baselib.report(0x00, "TD4.7.5 beginning.")
-- 下面是初始化操作:
busilib.SetOrientation(1)             -- 设置USB的CC线,另一根则为Vconn线(这里设置CC1)
busilib.SetRpValue(1, 0)              -- 设置USB Source用于标识输出电流能力的电阻值,第二个参数写0代表500mA
local circ_times = 0                  -- 标识循环次数
-- 第一步:If VIF field Captive_Cable is set to YES, CVS emulates a receptacle as per condition 1 in Section D above, otherwise CVS emulates an Active cable as per condition 2
-- 如果VIF字段Captive_Cable设置为YES，CVS模拟一个插座，如上面D部分的条件1所述，否则CVS模拟一个有源电缆，如条件2所述
if Captive_Cable then
    busilib.setUsbCable(1, 0)                  -- CVS是否模拟主动电缆，第二个参数写0代表不模拟主动电缆
    tcpclib.SetPermission(1, 0)                -- 需要设置的权限，第二个参数由四位二进制组成。最高位至最低位分别为Vbus、Vconn、CC1、CC2的权限
else
    circ_times = 1                             -- 如果不是Captive_Cable，跳过一次循环
end

:: circ_start ::
if circ_times ~= 0 then
    busilib.SetSwitchState(SW.EMAK123_PWR, 1)  -- 打开三个 E-Marker 芯片的电源
end
-- 根据循环次数判断执行到哪个Conditions，然后打开对应开关
if circ_times == 1 then
    busilib.SetSwitchState(SW.EMAK1_CC1, 1)
elseif circ_times == 2 then
    busilib.SetSwitchState(SW.EMAK2_CC2, 1)
elseif circ_times == 3 then
    busilib.SetSwitchState(SW.EMAK3_CC3, 1)
end

-- 第二步:If VIF field Type_C_Vconn_Source is NO, CVS verifies the PUT does not source Vconn for the remainder of the test. [TD.4.7.5.V.1]
-- 如果VIF字段Type_C_Vconn_Source为NO，CVS验证PUT在测试的剩余时间内不提供Vconn
if not Type_C_Sources_Vconn then
    -- 牵扯问题：需要断开 CVS 提供的 VConn 才能测量待测物的 VConn 情况
    -- 如果 CVS 不提供 VConn、而是仅由待测物提供则无此问题（VConn 是否存在两侧都要提供的情况？）
    local Vvconn = busilib.GetADC(ADC.CC2, 4)
    baselib.report(0x00, "Vvconn is " .. Vvconn .. "mV.")
    if Vvconn < 2750 then   -- 2750 待定（群内 Table 3）
        baselib.report(0x00, "TD4.5.1.V.1 pass.")
    else
        baselib.report(0x00, "TD4.5.1.V.1 fail.")
    end
end

-- 第三步:CVS transitions to Unattached.SNK, For a PUT_R, CVS also applies Ra on one CC
busilib.setUsbCcs(CCS.Unattached)
busilib.setUsbRole(ROLE.Sink)
if PUT_R then
    busilib.SetSwitchState(SW.CC2_RA, 1)       -- 将CC2_RA开关打开
end
-- 第四步:CVS waits 5ms
baselib.delay(5)
-- 第五步:CVS verifies PUT presents Rp within max dcSRC.DRP x maxtDRP [TD.4.7.5.V.2]
baselib.delay(70)                     -- 等待max dcSRC.DRP(0.7) x max tDRP(100ms)
local VCC1 = busilib.GetADC(ADC.CC1, 4)
if VCC1 > 200 then
    baselib.report(0x00, "TD4.7.5.V.2 pass.")
else
    baselib.report(0x00, "TD4.7.5.V.2 fail.")
end
-- 第六步:CVS transitions to AttachWait.SNK
-- 目前没有 AttachWait.SNK 状态
-- 第七步:CVS verifies:
-- 7.a步:PUT keeps Rp attached since step 5 for tCCDebounce [TD.4.7.5.V.3]
-- PUT在步骤5中保持Rp连接tCCDebounce时间
-- 疑问：为什么不在步骤五写，反而在第七步验证
-- 7.b步:PUT removes Rp and presents Rd for tDRPTry + tPDDebounce [TD.4.7.5.V.4]
-- PUT移除Rp并在tDRPTry + tPDDebounce时间内呈现Rd
-- 7.c步:PUT removes Rd and presents Rp for tPDDebounce [TD.4.7.5.V.5]
-- PUT移除Rd并在tPDDebounce时间内呈现Rp
-- 第八步:CVS verifies PUT and CVS transition to Attached.SRC and Attached.SNK:
-- 8.a. PUT sources Vbus within tVbusON [TD.4.7.5.V.6]
-- PUT在tVbusON时间内提供Vbus
baselib.delay(275)               -- tVBUSON:275ms
if cstmlib.VBusVerified(1) then 
    baselib.report(0x00, "TD4.7.5.V.6 pass.")
else
    baselib.report(0x00, "TD4.7.5.V.6 fail.")
end
-- 8.b步:PUT sources current at the level it advertises with Type-C Current. [TD.4.7.5.V.7]
-- PUT按照Type-C Current广告的电流水平提供电流
busilib.SetDAC(DAC.VBUS_EL_I, 10*Src_PDO_Max_Current)    -- 设置VBUS电子负载的电流，大小和VIF相应字段有关（目前以为是Src_PDO_Max_Current）
local VBus = busilib.GetADC(ADC.VBUS, 4)                 -- 设置电子负载电流后，判断电源是否正常
baselib.report(0x00, "VBus is " .. VBus .. "mV.")
if VBus > 3670 then 
    baselib.report(0x00, "TD4.7.5.V.7 pass.")
else
    baselib.report(0x00, "TD4.7.5.V.7 fail.")
end
busilib.SetDAC(DAC.VBUS_EL_I, 0)                         -- 关闭电子负载
-- 8.c步:Vconn_tested = false
local Vconn_tested = false
-- 8.d步:If PUT supports USB PD:
if PUT_supports_PD then
    --[[ CVS verifies that:
    1、PUT stabilizes VBUS before initiating USB PD communications[TD.4.7.5.V.8]    PUT在启动USB PD通信之前稳定 VBUS
    2、CVS and PUT negotiate a contract. [TD.4.7.5.V.9]     CVS 和 PUT 协商一个合约  ]]
    VBus = busilib.GetADC(ADC.VBUS, 4)
    baselib.report(0x00, "VBus is " .. VBus .. "mV.")
    if VBus > 3670 then 
        baselib.report(0x00, "TD4.7.5.V.8 pass.")
    else
        baselib.report(0x00, "TD4.7.5.V.8 fail.")
    end
    -- 这里是2步
    tcpclib.SetPermission(1, 2)
    PN_result = tcpclib.PresetPowerNegotiation(1, 500)  -- timeout is 500ms
    if PN_result == LuaOk then
        baselib.report(0x00, "TD4.7.5.V.9 pass.")
    else
        baselib.report(0x00, "TD4.7.5.V.9 fail.")
    end
    --[[If PUT source capabilities include a Max Current > 3 A:          (如果 PUT 的源端能力包括 最大电流 > 3 A)
    i. CVS verifies that for a PUT_R, it supplies Vconn within tVconnON [TD.4.7.5.V.10]     (CVS 验证PUT_R在 tVconnON 内提供 Vconn)
    ii. Vconn_tested = true]]
    if PUT_SOURCE_CAP_HIGER_3A then                      -- 这里直接取VIF字段PUT_SOURCE_CAP_HIGER_3A
        -- 没判断 Type_C_Sources_Vconn 字段？Source 不是必须提供 VConn？
        -- 测量待测物应加载了 VConn
        baselib.delay(2)                                 -- 等待tVconnON（2ms）
        Vvconn = busilib.GetADC(ADC.CC2, 4)
        baselib.report(0x00, "Vvconn is " .. Vvconn .. "mV.")
        if Vvconn > 2750 then   -- 2750 待定（群内 Table 3）
            baselib.report(0x00, "TD4.3.1.V.1 pass.")
        else
            baselib.report(0x00, "TD4.3.1.V.1 fail.")
        end
        Vconn_tested = true
    end
    --这一步和第二步有一样的问题
end
-- 8.f步:Else if PUT supports USB 2.0:PUT starts data communications on its D+/D- pair. [TD.4.7.5.V.15]
-- 放空
-- 8.g步:If the PUT is a PUT_V and not Vconn_tested:CVS verifies that for a PUT_R, it supplies Vconn within tVconnON [TD.4.7.5.V.16]
-- 如果 PUT 是 PUT_V 且未测试 Vconn. CVS 验证对于 PUT_R，它在 tVconnON 内提供 Vconn
if PUT_V and not Vconn_tested then
    baselib.delay(2)                                       -- 等待tVconnON（2ms）
    Vvconn = busilib.GetADC(ADC.CC2, 4)
    baselib.report(0x00, "Vvconn is " .. Vvconn .. "mV.")
    if Vvconn > 2750 then  
        baselib.report(0x00, "TD4.7.5.V.16 pass.")
    else
        baselib.report(0x00, "TD4.7.5.V.16 fail.")
    end
end
-- 第九步:CVS transitions to Disabled
busilib.setUsbCcs(CCS.Disabled)
-- 第十步:CVS verifies that PUT transitions to Unattached.SNK within tSRCDisconnect:
-- 10.a步:PUT stops sourcing Vbus within tVbusOFF [TD.4.7.5.V.20]
baselib.delay(650)       --650（tVBUSOFF）
VBus = busilib.GetADC(ADC.VBUS, 4)
baselib.report(0x00, "VBus is " .. VBus .. "mV.")
if VBus < 3670 then 
    baselib.report(0x00, "TD4.7.5.V.20 pass.")
else
    baselib.report(0x00, "TD4.7.5.V.20 fail.")
end
-- 10.c步:PUT data communication has ceased. [TD.4.7.5.V.18]
-- 10.d步:PUT attaches Rd on its CC pins. [TD.4.7.5.V.19]
VCC1 = busilib.GetADC(ADC.CC1, 4)
baselib.report(0x00, "CC1 is " .. VCC1 .. "mV.")
if VCC1 < 200 then
    baselib.report(0x00, "TD4.7.5.V.19 pass.")
else
    baselib.report(0x00, "TD4.7.5.V.19 fail.")
end
-- 关闭所有开关
busilib.SetSwitchState(SW.EMAK1_CC1, 0)
busilib.SetSwitchState(SW.EMAK2_CC2, 0)
busilib.SetSwitchState(SW.EMAK3_CC3, 0)
busilib.SetSwitchState(SW.EMAK123_PWR, 0)
-- 第十一步:If VIF field Captive_Cable is NO, the CVS continues the test with step 2, using the next Condition from section D above
-- 这一步就是循环执行剩下的Condition
if not Captive_Cable and circ_times < 3 then
    circ_times = circ_times + 1
    goto circ_start
end

baselib.report(0x00, "Demo is done here.")
baselib.report(0x07, "\x04")